今晚我想來點...
麻而不辣的 linker script
[叮咚]
您的外送餐點到瞜, 已經依照您的指示放在門口但不能放在地板了 謝謝 記得給我5星好評
: &@!^&$>%*
首先 今天會簡單說明什麼是linker script,
昨天有提到編譯流程中, 到最後要做成執行檔的步驟會linking多個object起來
一般來說, gcc compiler default會使用internal linker script
$ ld --verbose
經由輸出可以看到
接著Linker script有幾個需要注意的地方
每個object file都有一個section list
裡面記載著每個section的address與offset
而section address的部分還有區分VMA(virtual memory address)與LMA(load memory address), 一般來說LMA==VMA.
以圖例來說, 0x4003f0. 在VMA上為此位址, 而加載時也同樣為0x4003f0.
但如果系統有開ASLR, 則每次加載位址都會加上不定的隨機化位址
所以在寫linker script的時候可以指定每個section在output file的位址
. = 0x10000;
.text :
{
*(.text)
}
舉例我們可以放一個counter在0x10000
這樣我們的text section就會從0x10000開始放
那明天就可以開始看我們會實作的lab範例